package fiuba.service.impl;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import fiuba.dao.EstadisticaDao;
import fiuba.dao.EstadisticaLecturaDao;
import fiuba.dao.NoticiaDao;
import fiuba.model.Configuracion;
import fiuba.model.Estadistica;
import fiuba.model.EstadisticaLectura;
import fiuba.model.Noticia;
import fiuba.service.NoticiaManager;
import fiuba.service.impl.GenericManagerImpl;
import fiuba.webapp.action.BaseAction;

public class NoticiaManagerImpl extends GenericManagerImpl<Noticia, Long> 
	implements NoticiaManager {
    NoticiaDao noticiaDao;
	EstadisticaDao estadisticaDao;
	EstadisticaLecturaDao estadisticaLecturaDao;

    public NoticiaManagerImpl(NoticiaDao noticiaDao, EstadisticaDao estadisticaDao
    		, EstadisticaLecturaDao estadisticaLecturaDao) {
        super(noticiaDao);
        this.noticiaDao = noticiaDao;
        this.estadisticaDao = estadisticaDao;
        this.estadisticaLecturaDao = estadisticaLecturaDao;
    }

    public void updateStats(Noticia noticia, boolean isNew) {
    	Estadistica e = null;
    	if (!isNew) try {
    		e = this.estadisticaDao.obtenerDeNoticia(noticia.getId());
    	} catch (Exception ex) {e = null;}
    	// Si no hay estadistica, la creo
    	if (e == null) {
    		e = new Estadistica();
    		e.setFechaCreacion(noticia.getFechaCreacion());
    	}
    	if (!isNew) {
    		e.registrarModificacion();
    	}
    	e.setNoticia(noticia);
    	e = estadisticaDao.save(e);
    }
    
    
	public List<Noticia> getNoticias(){
		return noticiaDao.findSinKeywords();
	}
	public List<Noticia> getNoticiasVigentes(){
		return noticiaDao.findVigentes();
	}
	public List<Noticia> getNoVigentes(){
		return noticiaDao.findNoVigentes();
	}
	
	public List<Noticia> findConLimit(int page, int pageSize){
		return noticiaDao.findConLimit(page, pageSize);
	}
    public List<Noticia> findConLimitYSeccion (int page, int pageSize, String secciones){
		return noticiaDao.findConLimitYSeccion(page, pageSize, secciones);
	}
    
    public String procesarHeaderNoticia(Noticia noticia, Configuracion config, BaseAction baseAction) {
    	StringBuffer ret = new StringBuffer();
		String key = "fecha.formato." + config.getDateFormat();
		Date fecha = noticia.getFechaCreacion();
		for (int iii = 1; iii <= 3; iii++) {
			if (config.isShowTitle() && (config.getTitleOrder() == iii)) {
				ret.append("<div style='");
				// Estilos
				if (!config.getTitleFont().equals("")) {
					ret.append("font-family:").append(config.getTitleFont()).append(";");
				}
				if (config.getTitleFontSize() != 0) {
					ret.append("font-size:").append(config.getTitleFontSize()).append("px;");
				}
				if (config.getTitlePadding() != 0) {
					ret.append("padding-bottom:").append(config.getTitlePadding()).append("px;");
				}
				if (!config.getTitleFontColor().equals("")) {
					ret.append("color:").append(config.getTitleFontColor()).append(";");
				}
				if (config.isTitleFontBold()) {
					ret.append("font-weight: bolder;");
				}
				ret.append("'>").append(noticia.getTitulo()).append("</div>");
			}
			if (config.isShowAutor() && (config.getAutorOrder() == iii)) {
				ret.append("<div style='");
				// Estilos
				if (!config.getAutorFont().equals("")) {
					ret.append("font-family:").append(config.getAutorFont()).append(";");
				}
				if (config.getAutorFontSize() != 0) {
					ret.append("font-size:").append(config.getAutorFontSize()).append("px;");
				}
				if (config.getAutorPadding() != 0) {
					ret.append("padding-bottom:").append(config.getAutorPadding()).append("px;");
				}
				if (!config.getAutorFontColor().equals("")) {
					ret.append("color:").append(config.getAutorFontColor()).append(";");
				}
				if (config.isAutorFontBold()) {
					ret.append("font-weight: bolder;");
				}
				ret.append("'>").append(noticia.getAutor()).append("</div>");
			}
			if (config.isShowDate() && (config.getDateOrder() == iii) ) {
				if (fecha != null) { try {
		            List<String> args = new ArrayList<String>();
		            args.add("" +fecha.getDate());
		            args.add("" + (fecha.getMonth() + 1));
		            args.add("" + (1900 + fecha.getYear()) );
		            args.add(baseAction.getText("meses." + (fecha.getMonth() + 1)));
		            args.add(baseAction.getText("dias." + fecha.getDay()));
					String fechaConFormato = baseAction.getText(key,args);
					ret.append("<div  style='");
					// Estilos
					if (!config.getDateFont().equals("")) {
						ret.append("font-family:").append(config.getDateFont()).append(";");
					}
					if (config.getDateFontSize() != 0) {
						ret.append("font-size:").append(config.getDateFontSize()).append("px;");
					}
					if (config.getDatePadding() != 0) {
						ret.append("padding-bottom:").append(config.getDatePadding()).append("px;");
					}
					if (!config.getDateFontColor().equals("")) {
						ret.append("color:").append(config.getDateFontColor()).append(";");
					}
					if (config.isDateFontBold()) {
						ret.append("font-weight: bolder;");
					}
					ret.append("'>").append(fechaConFormato.toString()).append("</div>");
					}catch (Exception e) {
					}
				}
			}
			
		}
		
		return ret.toString();
    }
    
    public void registrarVista(Long id){
    	List <EstadisticaLectura>  estadisticas = this.estadisticaLecturaDao.obtenerDeNoticia(id);
    	Date hoy = new Date();
    	hoy.setHours(0);
    	hoy.setMinutes(0);
    	hoy.setSeconds(0);
    	
    	Calendar cal = Calendar.getInstance();
		Calendar comparar = Calendar.getInstance();
    	cal.clear();
    	cal.set(hoy.getYear(), hoy.getMonth(), hoy.getDate());
    	
    	EstadisticaLectura e = null;
    	for (EstadisticaLectura etemp : estadisticas) {
    		comparar.clear();
    		comparar.set(etemp.getFecha().getYear()
    				, etemp.getFecha().getMonth()
    				, etemp.getFecha().getDate());
    		if (cal.compareTo(comparar) == 0) {
//    			log.debug("SUCCESS");
    			e = etemp;
    		}
    	}
    	if (e == null) {
    		e = new EstadisticaLectura();
    		e.setAccesos(0);
    		e.setFecha(hoy);
    		e.setNoticia(this.noticiaDao.get(id));
    	}
    	e.setAccesos(e.getAccesos() + 1);
    	this.estadisticaLecturaDao.save(e);
    }
}

